package client;
import game.Game;
import game.Player;

import java.awt.*;
import java.awt.event.*;
import java.util.Observable;
import java.util.Observer;

import javax.swing.*;

/**
 * Liste les parties sur le serveur ainsi que la liste des joueurs
 * @author CONSTANTIN Laurent
 * @version 1.0
 */
public class JPanelListGame extends JPanel implements Observer {
	
	/**
	 * Initialisation
	 */
	private static final long serialVersionUID = -8534945718350248903L;
	private final ClientApplication clientApp;

	private JButton createGameBtn = new JButton("Nouvelle partie");
	private JLabel titrePlayer = new JLabel();
	private JLabel titreGames = new JLabel();

	// Liste des joueurs 
	private DefaultListModel playerModel = new DefaultListModel();
	private JList playerList = new JList(playerModel);
	private JScrollPane containerPlayers  = new JScrollPane(playerList);
	
	private JspPlayersInfos jspPlayers  = new JspPlayersInfos(false);	// Liste des joueurs
	private JspGamesInfos jspGames = new JspGamesInfos();				// Liste des parties
	
	/**
	 * L'application client
	 * @param clientApp
	 */
	public JPanelListGame(ClientApplication clientApp) {
		this.clientApp = clientApp;

		setLayout(new BoxLayout(this, 1));

		// Action sur le bouton cree une partie
		createGameBtn.setPreferredSize(new Dimension(50, 50));
		createGameBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JPanelListGame.this.clientApp.getClientView().showConfigGame();
			}
		});

		// Definit les titres
		titrePlayer.setText("Liste des joueurs");
		titrePlayer.setFont(new Font(titrePlayer.getFont().getName(),
				titrePlayer.getFont().getStyle(), 22));

		titreGames.setText("Liste des parties");
		titreGames.setFont(new Font(titrePlayer.getFont().getName(),
				titrePlayer.getFont().getStyle(), 22));
		
		// Ajout
		this.add(titrePlayer);
		this.add(jspPlayers);
		this.add(titreGames);
		this.add(jspGames);
		this.add(createGameBtn);
		
		this.setPreferredSize(new Dimension(400,400));		
	}
	/**
	 * Gere les notifications
	 */
	public void update(Observable sender, Object o) {
		// Nouvelle liste de joueurs
		if (o instanceof Player[]) {
			updatePlayerList((Player[]) o);
		// Nouvelle liste de parties
		}else if( o instanceof Game[]){
			updateGameList((Game[])o);
		}
	}
	/**
	 * Rafraichit la liste des parties
	 * @param games La listes des parties
	 */
	public void updateGameList(Game[] games) {
		if(games == null)
			return;
		jspGames.refreshGames(clientApp, games);
		repaint();		
	}
	
	/**
	 * Rafraichit la liste des joueurs
	 * @param players La liste des joueurs
	 */
	public void updatePlayerList(Player[] players) {
		if(players == null)
			throw new NullPointerException("Liste des joueurs NULL");
		
		jspPlayers.refreshGames(players, false, null);
		containerPlayers.repaint();
		repaint();
	}

}